﻿/*!
* jQuery CTI plugin: 
* 
* version 0.1 2011-05-12
* Requires jQuery v1.3.2 or later
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
* Authors: Kim Seoung Min
*/
var jCtiData;
var statusCode;
var statusName;
var jCallData;



(function ($) {
    $.fn.CTI = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.tooltip');
        }
    };




    var methods = {
        init: function (url) {
            jCtiData = GetJsonSync(url);
            $(this).data("jCtiData", jCtiData);

            Ghtml = this.CTI("ctiModuleGenerator", jCtiData);

            var CTI = $(this);
            var ServerOBJ = $("<div id='ServerOBJ'></div>").appendTo("#CallMonitorBoard");
            ServerOBJ.html(Ghtml) // CTI 객체생성
            var CallCount = $("<div class = 'CallCount ui-widget-header'></div>").appendTo("#CallMonitorBoard");
            var CallMonitorTable = "";
                        
            CallMonitorTable += "<table border='0' cellpadding='0' cellspacing='0' >";
            CallMonitorTable += "<colgroup>";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "<col width = '10%' />";
            CallMonitorTable += "</colgroup>";
            CallMonitorTable += "<tr class = 'ui-widget-header'>";
            CallMonitorTable += "<td>응답모드</td>";
            CallMonitorTable += "<td>상담원상태</td>";
            CallMonitorTable += "<td>호분배시도콜</td>";
            CallMonitorTable += "<td>호분배연결콜</td>";
            CallMonitorTable += "<td>인바운드시도콜</td>";
            CallMonitorTable += "<td>인바운드연결콜</td>";
            CallMonitorTable += "<td>아웃바운드시도콜</td>";
            CallMonitorTable += "<td>아웃바운드연결콜</td>";
            CallMonitorTable += "<td>고객대기자수</td>";
            CallMonitorTable += "<td>내선번호</td>";
            CallMonitorTable += "</tr>";
            CallMonitorTable += "<tr>";
            CallMonitorTable += "<td><input id='CM_responseMode' class='txtCallCount ui-widget-content' type='text' readonly  /></td>";
            CallMonitorTable += "<td><input id='CM_status' class='txtCallCount ui-widget-content' type='text' readonly /></td>";
            CallMonitorTable += "<td><input id='CM_transferTryCnt' class='txtCallCount ui-widget-content' type='text'  readonly/></td>";
            CallMonitorTable += "<td><input id='CM_transferConnectCnt' class='txtCallCount ui-widget-content' type='text'  readonly/></td>";
            CallMonitorTable += "<td><input id='CM_ibTryCnt' class='txtCallCount ui-widget-content' type='text'  readonly/></td>";
            CallMonitorTable += "<td><input id='CM_ibConnectCnt' class='txtCallCount ui-widget-content' type='text'  readonly/></td>";
            CallMonitorTable += "<td><input id='CM_obTryCnt' class='txtCallCount ui-widget-content' type='text'  readonly/></td>";
            CallMonitorTable += "<td><input id='CM_obConnectCnt' class='txtCallCount ui-widget-content' type='text'  readonly/></td>";
            CallMonitorTable += "<td><input id='CM_wattingCnt' class='txtCallCount ui-widget-content' type='text'  readonly/></td>";
            CallMonitorTable += "<td><input id='CM_CallExtension' class='txtCallCount ui-widget-content' type='text' readonly /></td>";
            CallMonitorTable += "</tr>";
            CallMonitorTable += "</table>";

            CallCount.html(CallMonitorTable);

            var CTILog = $("<div id='CTILog' class=''><textarea id='CTILogTxt'></textarea></div>").appendTo(CTI);
            var CTIButtons = $("<UL id='CTIButtons' class=''></UL>").appendTo(CTI);

            $("<li id='CTI_BTN_Login' class='CTI_BTN CTI_BTN_Login'></li>").appendTo(CTIButtons);
            $("<li  class='CTI_BTN'><select id='CTI_BTN_TellerMode' readonly><option value='0'>인바운드</option><option value='1'>아웃운드</option></select></li>").appendTo(CTIButtons);
	        $("<li id='CTI_BTN_ChangeMode' class='CTI_BTN '><a href='javascript:void(0)'>모드변경</a></li>").appendTo(CTIButtons);
            $("<li id='CTI_BTN_Answer' class='CTI_BTN CTI_BTN_Answer_OFF'></li>").appendTo(CTIButtons);
            $("<li id='CTI_BTN_Hangup' class='CTI_BTN CTI_BTN_Hangup_OFF'></li>").appendTo(CTIButtons);
            $("<li id='CTI_BTN_Pickup' class='CTI_BTN'><a href='javascript:void(0)'>당겨받기</a></li>").appendTo(CTIButtons);
            $("<li id='CTI_BTN_Hold' class='CTI_BTN CTI_BTN_Hold_OFF'></li>").appendTo(CTIButtons);
            $("<li  class='CTI_BTN'><select id='CTI_BTN_TellerStatus'></select></li>").appendTo(CTIButtons);
            $("<li id='CTI_BTN_ChangeStatus' class='CTI_BTN '><a href='javascript:void(0)'>상태변경</a></li>").appendTo(CTIButtons);

            $("<li id='CTI_BTN_ShowLog' class='CTI_BTN'><a href='javascript:void(0)'>로그..</a></li>").appendTo(CTIButtons);

            $('#CTI_BTN_Login').bind("click", function (e) { //login
                if ($('#CTI_BTN_Login').hasClass('CTI_BTN_Login')) {
                    document.getElementById("CTIA").login(jCtiData.id, jCtiData.password, jCtiData.extension);
                    $('#CTI_BTN_Login').removeClass('CTI_BTN_Login').addClass('CTI_BTN_Logout');
                    //$('#CTI_BTN_Answer').removeClass('CTI_BTN_Answer_OFF').addClass('CTI_BTN_Answer');
                }
                else { //logout
                    document.getElementById("CTIA").logout();
                    $('#CTI_BTN_Login').removeClass('CTI_BTN_Logout').addClass('CTI_BTN_Login');
                    //$('#CTI_BTN_Answer').removeClass('CTI_BTN_Answer').addClass('CTI_BTN_Answer_OFF');
                }
            });

            $('#CTI_BTN_ChangeStatus').bind("click", function (e) {
                func_changeTellerStatus($('#CTI_BTN_TellerStatus').val());
            });

            $('#CTI_BTN_ChangeMode').bind("click", function (e) {
                func_changeMode($('#CTI_BTN_TellerMode').val());
            });
            

            $('#CTI_BTN_Answer').bind("click", function (e) {
                if ($('#CTI_BTN_Answer').hasClass('CTI_BTN_Answer_OFF')) return ;
                func_CallAnswer();
            });
            $('#CTI_BTN_Hangup').bind("click", function (e) {
                if ($('#CTI_BTN_Hangup').hasClass('CTI_BTN_Hangup_OFF')) return ;
                func_CallHangup();
            });

            $('#CTI_BTN_Pickup').bind("click", function (e) {
                //if ($('#CTI_BTN_Hangup').hasClass('CTI_BTN_Hangup_OFF')) return ;
                func_CallPickup();
            });

            $('#CTI_BTN_Hold').bind("click", function (e) {
                if ($('#CTI_BTN_Hold').hasClass('CTI_BTN_Hold_OFF')) return ;
                if ($('#CTI_BTN_Hold').hasClass('CTI_BTN_Hold')) func_hold(); 
                if ($('#CTI_BTN_Hold').hasClass('CTI_BTN_Holdcan')) func_unhold(); 
            });
            
            $('#CTI_BTN_ShowLog').bind("click", function (e) {
                $('#CTILog').toggle();
            });
            

            $('#CM_responseMode').val("인바운드"); // 상담원 CTI계정표시함
            $('#CM_CallExtension').val(jCtiData.id); // 상담원 CTI계정표시함
            //this.CTI("ServerStatusCheck"); // 서버객체상태진단
            $('#CTILog').toggle();

            return this;
        },
        
        ServerStatusCheck: function () {
            if (func_loadingCheck() == true) {
                $("#ServerStatus").addClass("CTIActiveGreen");
                ctiMessage("Call Connect"); 
            }
            else {
                $("#ServerStatus").addClass("CTIActiveRed");
                ctiMessage("Call DisConnect"); 
            }
        },

        ctiModuleGenerator: function (jCtiData) {
            var result = "";
            result += " <OBJECT id='CTIA' ";
            result += " classid = 'clsid:8AD9C840-044E-11D1-B3E9-00805F499D93' ";
            result += " codebase = 'http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=1,5,0,0' ";
            result += " WIDTH = 0 HEIGHT = 0 > ";
            result += " <PARAM NAME = 'CODE' VALUE = 'mclientagent.ClientAgent.class' > ";
            result += " <PARAM NAME = 'ARCHIVE' VALUE = 'MClientAgent.jar' > ";
            result += " <PARAM NAME = 'type' VALUE = 'application/x-java-applet;version=1.5'> ";
            result += " <PARAM NAME = 'scriptable' VALUE = 'false'> ";
            result += " <PARAM NAME = 'ServerIP' VALUE='" + jCtiData.CTI_SERVER_IP + "'>";
            result += " </OBJECT> ";
            return result;
        },

        // 브라우즈를 닫거나 다른페이지로 이동할때 적용되는 기능
        Logout: function (options) {
            document.getElementById("CTIA").logout();
            return this;
            },

        Help: function (options) {
            alert(options + "-" + "옵션입니다");
            return this;

        }
    };
})(jQuery);

function func_loadingCheck() {
    var rtn;
    rtn = false;
    try {
        if (document.getElementById("CTIA") != null)
            document.getElementById("CTIA").isActive() == true ? rtn = true : rtn = false;

        if (rtn == false) {
            alert("CTI 모둘이 로딩되지 않았습니다.\n로딩 후 사용하세요.");
        } else {
            document.getElementById("CTIA").isConnectedSocket() == true ? rtn = true : rtn = false;
            if (rtn == false)
                alert("CTI서버와 접속되지 않았습니다.\n접속 후 사용하세요.");
        }
        return rtn;
    }
    catch (e) {
        msg = e.message;
        alert(msg);
    }
}

// 상담모드변경
function func_changeMode(tellerMode) { 
    if (func_loadingCheck() == false)
        return;
    if (tellerMode == "") {
        alert("상담모드를 선택하세요.");
        return;
    }
    document.getElementById("CTIA").changeTellerMode(tellerMode); // 0 - 인바운드, 1 - 아웃바운드
}

// 전화 팝업이 발생하는 경우에 전화받기, 전화끊기 버턴을 활성화 시켜서 전화를 받을수 있도록 한다.
function func_changeAnswer(_jCallData) { 
    $('#CTI_BTN_Answer').removeClass('CTI_BTN_Answer_OFF').addClass('CTI_BTN_Answer');
    $('#CTI_BTN_Hangup').removeClass('CTI_BTN_Hangup_OFF').addClass('CTI_BTN_Hangup');
    UIfun_InCall(_jCallData);
}

// 전화를 받아서 실제 상담이 시작되도록 한다. (전달된 녹취파일을 보관한다) 
function func_CallStart(_jCallData) {
    $('#CTI_BTN_Answer').removeClass('CTI_BTN_Answer').addClass('CTI_BTN_Answer_OFF');
    $('#CTI_BTN_Hold').removeClass('CTI_BTN_Hold_OFF').addClass('CTI_BTN_Hold');
    
}

// cti 전화받기
function func_CallAnswer() {
    if(func_loadingCheck() == false) return;
    document.getElementById("CTIA").answer();
}
// cti 전화끊기
function func_CallHangup() {
	if(func_loadingCheck() == false) return;
	document.getElementById("CTIA").hangup();
}
// 당겨받기
function func_CallPickup() {
	if(func_loadingCheck() == false) return;
	document.getElementById("CTIA").pickup();
}
// 보류
function func_hold() {
	if(func_loadingCheck() == false) return;
    document.getElementById("CTIA").hold();

}
// 보류해제
function func_unhold() { 
	if(func_loadingCheck() == false) return;
	document.getElementById("CTIA").unhold();

}
// 상담원상태변경
function func_changeTellerStatus(tellerStatus) { 
    if (func_loadingCheck() == false)
        return;
    if (tellerStatus == "") {
        alert("상담원상태를 선택하세요.");
        return;
    }
    document.getElementById("CTIA").changeTellerStatus(tellerStatus);
}

function fun_changeCallStatus(sCode,sName) {
    $("#CM_status").val(sName);
     
    //0300^전화대기^R001^휴식^R002^이석^L001^식사^W001^회의.교육^W002^문서작성^W003^해피콜^W004^상담후처리^W005^업무처리^01:50:53
    switch (sCode) {
        case '0300':
            $('#CTI_BTN_Answer').removeClass('CTI_BTN_Answer_OFF').removeClass('CTI_BTN_Answer').addClass('CTI_BTN_Answer_OFF');
            $('#CTI_BTN_Hangup').removeClass('CTI_BTN_Hangup_OFF').removeClass('CTI_BTN_Hangup').addClass('CTI_BTN_Hangup_OFF');
            $('#CTI_BTN_Hold').removeClass('CTI_BTN_Holdcan').removeClass('CTI_BTN_Hold').removeClass('CTI_BTN_Hold_OFF').addClass('CTI_BTN_Hold_OFF');
            break;
        case '0371': // HOLD In
            $('#CTI_BTN_Hold').removeClass('CTI_BTN_Hold').addClass('CTI_BTN_Holdcan');
            break;
        case '0315': // HOLD In
            $('#CTI_BTN_Hold').removeClass('CTI_BTN_Holdcan').addClass('CTI_BTN_Hold');
            break;
       }   
}

function ctiMessage(msg)  {
    // $("#ServerStatus a").html(msg);
     $("#CM_status").val(msg);
}

function ctiEvent(msg) // applet에서 호출시켜주는 메소드(함수명을 변경하지 마세요), msg 정의는 별첨(CTI Event.ppt) 파일을 참고하세요.
{
    clog = document.getElementById("CTILogTxt");
    clog.value = msg + "\n\n"+clog.value ;

    var tmpData = msg.split("^");

    if (tmpData[0] == "00") {				// 로그인 응답
        if (tmpData[4] == "1") {
            ctiMessage("로그인되었습니다.");
        } else if (tmpData[4] == "2") {
            ctiMessage("아이디가 존재하지 않습니다.");
        } else if (tmpData[4] == "3") {
            ctiMessage("비밀번호가 일치하지 않습니다.");
        } else if (tmpData[4] == "4") {
            ctiMessage("로그온이 중복되었습니다.");
        } else if (tmpData[4] == "5") {
            ctiMessage("내선번호가 중복되었습니다.");
        } else if (tmpData[4] == "6") {
            ctiMessage("등록이 안된 번호입니다.");
        } else if (tmpData[4] == "7") {
            ctiMessage("상담원기본그룹 오류입니다.");
        }
    } else if (tmpData[0] == "02") {			// 비밀번호변경 응답
        if (tmpData[4] == "1") {
            ctiMessage("비밀번호가 변경되었습니다.");
        } else if (tmpData[4] == "2") {
            ctiMessage("잘못된 아이디입니다.");
        } else if (tmpData[4] == "3") {
            ctiMessage("잘못된 비밀번호입니다.");
        }
    } else if (tmpData[0] == "85") {			// 상담원 등답모드 응답
        if (tmpData[1] == jCtiData.id) {		// 받은 데이터가 로그인한 상담원의 아이디와 같은 경우
            if (tmpData[2] == "0")
                $("#CM_responseMode").val("인바운드");
            else if (tmpData[2] == "1")
                $("#CM_responseMode").val("아웃바운드");
        }
    } else if (tmpData[0] == "86") {			// 스크린 팝업
    jCallData = {
        PTYPE: tmpData[1], //팝업타입 ("01" : 호분배,"02" : 인바운드,"03" : 인바운드(돌려주기),"04" : 아웃바운드,
        //"05" : 오토콜,"06" : 당겨받기,"07" : 돌려받기,"08" : 3자통화)
        RTYPE: tmpData[2], //팝업시점 "1" : Ring (팝업타입 "06", "07" 제외) "2" : Answer
        A1: tmpData[3], //대표번호
        A2: tmpData[4], //발신자번호
        A3: tmpData[5], //IVR 연동데이터
        A4: tmpData[6], //CALL_ID (고유번호)
        A5: tmpData[7], //IVR메뉴번호
        A6: tmpData[8], //사용자데이터
        A7: tmpData[9], //녹취파일명:
        A8: tmpData[10], //녹취폴더(녹취일)
        B1: tmpData[11], //대표번호
        B2: tmpData[12], //발신자번호
        B3: tmpData[13], //IVR 연동데이터
        B4: tmpData[14], //CALL_ID (고유번호)
        B5: tmpData[15], //IVR메뉴번호
        B6: tmpData[16] //사용자데이터
    };     
        
//        alert("[스크린팝업정보]\n팝업타입:" + tmpData[1] + "\n팝업시점:" + tmpData[2] + "\nA-1 대표번호:" + tmpData[3] +
//		      "\nA-2 발신자번호:" + tmpData[4] + "\nA-3 IVR 연동데이터:" + tmpData[5] + "\nA-4 CALL_ID:" + tmpData[6] +
//		      "\nA-5 IVR메뉴번호:" + tmpData[7] + "\nA-6 사용자데이터:" + tmpData[8] + "\nA-7 녹취파일명:" + tmpData[9] +
//		      "\nA-8 녹취폴더(녹취일):" + tmpData[10] + "\nB-1 대표번호:" + tmpData[11] + "\nB-2 발신자번호:" + tmpData[12] +
//		      "\nB-3 IVR 연동데이터:" + tmpData[13] + "\nB-4 콜아이디:" + tmpData[14] + "\nB-5 IVR메뉴번호:" + tmpData[15] +
//		      "\nB-6 사용자데이터:" + tmpData[16]);

    switch (jCallData.PTYPE) {
        case '02':
            if (jCallData.RTYPE == "1") func_changeAnswer(jCallData); // 전화파업상태로 변경호출 (녹취파일명이 넘어오지않음)
            if (jCallData.RTYPE == "2") func_CallStart(jCallData); // 상담을 시작합니다 (녹취파일명이 넘어옴)
            break;
       }        

    } else if (tmpData[0] == "89") {			// 상담원이 변경할 수 있는 상태정보 응답
        var op = document.getElementById("CTI_BTN_TellerStatus")
        op.options.length = 0;
        for (var i = 1; i < tmpData.length - 1; i += 2) {
            var addedOpt = document.createElement('OPTION');
            op.add(addedOpt);
            addedOpt.value = tmpData[i];
            addedOpt.text = tmpData[i + 1];
        }
    } else if (tmpData[0] == "90") {			// CTI 상태정보 응답
        var j = 0;
        statusCode = new Array((tmpData.length - 2) / 2);
        statusName = new Array((tmpData.length - 2) / 2);
        for (var i = 1; i < tmpData.length - 1; i += 2) {
            statusCode[j] = tmpData[i];
            statusName[j] = tmpData[i + 1];
            j++;
        }
    } else if (tmpData[0] == "94") {			// 상담원 상태 변경 
        if (tmpData[1] == jCtiData.id) {				// 받은 데이터가 로그인한 상담원의 아이디와 같은 경우
            for (var i = 0; i < statusCode.length; i++) {
                if (statusCode[i] == tmpData[5]) {
                    //document.form1.status.value = statusName[i];
                    fun_changeCallStatus(statusCode[i],statusName[i] )
                    //$("#ServerStatus a").html(statusName[i]); 
                    break;
                }
            }

			$('#CM_transferTryCnt').val(tmpData[9]);
			$('#CM_transferConnectCnt').val(tmpData[10]);
			$('#CM_ibTryCnt').val(tmpData[11]);
			$('#CM_ibConnectCnt').val(tmpData[12]);
			$('#CM_obTryCnt').val(tmpData[13]);
			$('#CM_obConnectCnt').val(tmpData[14]);

        }
    } else if (tmpData[0] == "95") {			// 고객대기자수 
          $('#CM_wattingCnt').val(tmpData[1]);  

    } else if (tmpData[0] == "20") {			// 콜백정보 알림
//        alert("[콜백정보]\n신규메시지:" + tmpData[1] + "건\n대그룹:" + tmpData[2] + "\n중그룹:" + tmpData[3] + "\n소그룹:" + tmpData[4] + "\n대표번호:" + tmpData[5]);
    } else if (tmpData[0] == "01") {			// 강제로그아웃(타 모듈에서 강제로그인 하면 기존의 모듈은 로그아웃 됨으로 기존 모듈에게 로그아웃 메시지 알림.)
//        alert("강제로그아웃 되었습니다.");

//        document.form1.responseMode.value = "";
//        document.form1.status.value = "";
//        document.form1.transferTryCnt.value = "";
//        document.form1.transferConnectCnt.value = "";
//        document.form1.ibTryCnt.value = "";
//        document.form1.ibConnectCnt.value = "";
//        document.form1.obTryCnt.value = "";
//        document.form1.obConnectCnt.value = "";
//        document.form1.wattingCnt.value = "";
    }
}
